diff --git a/test/dm/usb.c b/test/dm/usb.c
index ccc07d5..721d3ad 100644
--- a/test/dm/usb.c
+++ b/test/dm/usb.c
@@ -12,8 +12,11 @@
 #include <asm/state.h>
 #include <dm/device-internal.h>
 #include <dm/test.h>
+#include <dm/uclass-internal.h>
 #include <test/ut.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 /* Test that sandbox USB works correctly */
 static int dm_test_usb_base(struct unit_test_state *uts)
 {
@@ -52,3 +55,156 @@
 	return 0;
 }
 DM_TEST(dm_test_usb_flash, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+/* test that we can handle multiple storage devices */
+static int dm_test_usb_multi(struct unit_test_state *uts)
+{
+	struct udevice *dev;
+
+	state_set_skip_delays(true);
+	ut_assertok(usb_init());
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
+
+	return 0;
+}
+DM_TEST(dm_test_usb_multi, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+static int count_usb_devices(void)
+{
+	struct udevice *hub;
+	struct uclass *uc;
+	int count = 0;
+	int ret;
+
+	ret = uclass_get(UCLASS_USB_HUB, &uc);
+	if (ret)
+		return ret;
+
+	uclass_foreach_dev(hub, uc) {
+		struct udevice *dev;
+
+		count++;
+		for (device_find_first_child(hub, &dev);
+		     dev;
+		     device_find_next_child(&dev)) {
+			count++;
+		}
+	}
+
+	return count;
+}
+
+/* test that we can remove an emulated device and it is then not found */
+static int dm_test_usb_remove(struct unit_test_state *uts)
+{
+	struct udevice *dev, *emul;
+
+	/* Scan and check that all devices are present */
+	state_set_skip_delays(true);
+	ut_assertok(usb_init());
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
+	ut_asserteq(5, count_usb_devices());
+	ut_assertok(usb_stop());
+	ut_asserteq(5, count_usb_devices());
+
+	/* Remove the second emulation device */
+	ut_assertok(uclass_find_device_by_name(UCLASS_USB_EMUL, "flash-stick@1",
+					       &dev));
+	ut_assertok(device_unbind(dev));
+
+	/* Rescan - only the first and third should be present */
+	ut_assertok(usb_init());
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
+	ut_assertok(usb_emul_find_for_dev(dev, &emul));
+	ut_asserteq_str("flash-stick@0", emul->name);
+	ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
+	ut_assertok(usb_emul_find_for_dev(dev, &emul));
+	ut_asserteq_str("flash-stick@2", emul->name);
+
+	ut_asserteq(-ENODEV, uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
+
+	ut_asserteq(4, count_usb_devices());
+	ut_assertok(usb_stop());
+	ut_asserteq(4, count_usb_devices());
+
+	return 0;
+}
+DM_TEST(dm_test_usb_remove, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+const char usb_tree_base[] =
+"  1  Hub (12 Mb/s, 100mA)\n"
+"  |  sandbox hub 2345\n"
+"  |\n"
+"  |\b+-2  Mass Storage (12 Mb/s, 100mA)\n"
+"  |    sandbox flash flash-stick@0\n"
+"  |  \n"
+"  |\b+-3  Mass Storage (12 Mb/s, 100mA)\n"
+"  |    sandbox flash flash-stick@1\n"
+"  |  \n"
+"  |\b+-4  Mass Storage (12 Mb/s, 100mA)\n"
+"       sandbox flash flash-stick@2\n"
+"     \n";
+
+/* test that the 'usb tree' command output looks correct */
+static int dm_test_usb_tree(struct unit_test_state *uts)
+{
+	char *data;
+	int len;
+
+	state_set_skip_delays(true);
+	ut_assertok(usb_init());
+	console_record_reset_enable();
+	usb_show_tree();
+	len = membuff_getraw(&gd->console_out, -1, true, &data);
+	if (len)
+		data[len] = '\0';
+	ut_asserteq_str(usb_tree_base, data);
+	ut_assertok(usb_stop());
+
+	return 0;
+}
+DM_TEST(dm_test_usb_tree, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+const char usb_tree_remove[] =
+"  1  Hub (12 Mb/s, 100mA)\n"
+"  |  sandbox hub 2345\n"
+"  |\n"
+"  |\b+-2  Mass Storage (12 Mb/s, 100mA)\n"
+"  |    sandbox flash flash-stick@0\n"
+"  |  \n"
+"  |\b+-3  Mass Storage (12 Mb/s, 100mA)\n"
+"       sandbox flash flash-stick@2\n"
+"     \n";
+
+/*
+ * test that the 'usb tree' command output looks correct when we remove a
+ * device
+ */
+static int dm_test_usb_tree_remove(struct unit_test_state *uts)
+{
+	struct udevice *dev;
+	char *data;
+	int len;
+
+	/* Remove the second emulation device */
+	ut_assertok(uclass_find_device_by_name(UCLASS_USB_EMUL, "flash-stick@1",
+					       &dev));
+	ut_assertok(device_unbind(dev));
+
+	state_set_skip_delays(true);
+	ut_assertok(usb_init());
+	console_record_reset_enable();
+	usb_show_tree();
+	len = membuff_getraw(&gd->console_out, -1, true, &data);
+	if (len)
+		data[len] = '\0';
+	ut_asserteq_str(usb_tree_remove, data);
+	ut_assertok(usb_stop());
+
+	return 0;
+}
+DM_TEST(dm_test_usb_tree_remove, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
